void GrGLVertexProgramEffects::emitEffect(GrGLFullShaderBuilder* builder, const GrEffectStage& stage, const GrEffectKey& key, const char* outColor, const char* inColor, int stageIndex) { GrDrawEffect drawEffect(stage, fHasExplicitLocalCoords); const GrEffect* effect = stage.getEffect(); SkSTArray<2, TransformedCoords> coords(effect->numTransforms()); SkSTArray<4, TextureSampler> samplers(effect->numTextures()); this->emitAttributes(builder, stage); this->emitTransforms(builder, drawEffect, &coords); this->emitSamplers(builder, effect, &samplers); GrGLEffect* glEffect = effect->getFactory().createGLInstance(drawEffect); fGLEffects.push_back(glEffect); // Enclose custom code in a block to avoid namespace conflicts SkString openBrace; openBrace.printf("\t{ // Stage %d: %s\n", stageIndex, glEffect->name()); builder->vsCodeAppend(openBrace.c_str()); builder->fsCodeAppend(openBrace.c_str()); if (glEffect->isVertexEffect()) { GrGLVertexEffect* vertexEffect = static_cast<GrGLVertexEffect*>(glEffect); vertexEffect->emitCode(builder, drawEffect, key, outColor, inColor, coords, samplers); } else { glEffect->emitCode(builder, drawEffect, key, outColor, inColor, coords, samplers); } builder->vsCodeAppend("\t}\n"); builder->fsCodeAppend("\t}\n"); }
void GrGLPathTexGenProgramEffects::emitEffect(GrGLFragmentOnlyShaderBuilder* builder, const GrEffectStage& stage, const GrEffectKey& key, const char* outColor, const char* inColor, int stageIndex) { GrDrawEffect drawEffect(stage, false); const GrEffect* effect = stage.getEffect(); SkSTArray<2, TransformedCoords> coords(effect->numTransforms()); SkSTArray<4, TextureSampler> samplers(effect->numTextures()); SkASSERT(0 == stage.getVertexAttribIndexCount()); this->setupPathTexGen(builder, drawEffect, &coords); this->emitSamplers(builder, effect, &samplers); GrGLEffect* glEffect = effect->getFactory().createGLInstance(drawEffect); fGLEffects.push_back(glEffect); // Enclose custom code in a block to avoid namespace conflicts SkString openBrace; openBrace.printf("\t{ // Stage %d: %s\n", stageIndex, glEffect->name()); builder->fsCodeAppend(openBrace.c_str()); SkASSERT(!glEffect->isVertexEffect()); glEffect->emitCode(builder, drawEffect, key, outColor, inColor, coords, samplers); builder->fsCodeAppend("\t}\n"); }
bool GrGLProgramDesc::GetEffectKeyAndUpdateStats(const GrEffectStage& stage, const GrGLCaps& caps, bool useExplicitLocalCoords, GrEffectKeyBuilder* b, uint16_t* effectKeySize, bool* setTrueIfReadsDst, bool* setTrueIfReadsPos, bool* setTrueIfRequiresVertexShader) { const GrBackendEffectFactory& factory = stage.getEffect()->getFactory(); GrDrawEffect drawEffect(stage, useExplicitLocalCoords); if (stage.getEffect()->willReadDstColor()) { *setTrueIfReadsDst = true; } if (stage.getEffect()->willReadFragmentPosition()) { *setTrueIfReadsPos = true; } if (stage.getEffect()->requiresVertexShader()) { *setTrueIfRequiresVertexShader = true; } factory.getGLEffectKey(drawEffect, caps, b); size_t size = b->size(); if (size > SK_MaxU16) { *effectKeySize = 0; // suppresses a warning. return false; } *effectKeySize = SkToU16(size); if (!GrGLProgramEffects::GenEffectMetaKey(drawEffect, caps, b)) { return false; } return true; }
void CPlayer::draw(IDirect3DDevice9* pd3dDevice,double eTime) { //그려주기 drawBoard(pd3dDevice); //임팩트주기 drawEffect(pd3dDevice,eTime); }
void GrGLPathTexGenProgramEffects::setData(GrGpuGL* gpu, const GrGLProgramDataManager& programResourceManager, const GrEffectStage* effectStages[]) { int numEffects = fGLEffects.count(); SkASSERT(numEffects == fTransforms.count()); SkASSERT(numEffects == fSamplers.count()); for (int e = 0; e < numEffects; ++e) { GrDrawEffect drawEffect(*effectStages[e], false); fGLEffects[e]->setData(programResourceManager, drawEffect); this->setPathTexGenState(gpu, drawEffect, e); this->bindTextures(gpu, drawEffect.effect(), e); } }
void GrGLVertexProgramEffects::setData(GrGpuGL* gpu, const GrGLProgramDataManager& programResourceManager, const GrEffectStage* effectStages[]) { int numEffects = fGLEffects.count(); SkASSERT(numEffects == fTransforms.count()); SkASSERT(numEffects == fSamplers.count()); for (int e = 0; e < numEffects; ++e) { GrDrawEffect drawEffect(*effectStages[e], fHasExplicitLocalCoords); fGLEffects[e]->setData(programResourceManager, drawEffect); this->setTransformData(programResourceManager, drawEffect, e); this->bindTextures(gpu, drawEffect.effect(), e); } }
void GrGLProgramDesc::setRandom(SkRandom* random, const GrGpuGL* gpu, const GrRenderTarget* dstRenderTarget, const GrTexture* dstCopyTexture, const GrEffectStage* stages[], int numColorStages, int numCoverageStages, int currAttribIndex) { int numEffects = numColorStages + numCoverageStages; size_t keyLength = KeyLength(numEffects); fKey.reset(keyLength); *this->atOffset<uint32_t, kLengthOffset>() = static_cast<uint32_t>(keyLength); memset(this->header(), 0, kHeaderSize); KeyHeader* header = this->header(); header->fEmitsPointSize = random->nextBool(); header->fPositionAttributeIndex = 0; // if the effects have used up all off the available attributes, // don't try to use color or coverage attributes as input do { header->fColorInput = static_cast<GrGLProgramDesc::ColorInput>( random->nextULessThan(kColorInputCnt)); } while (GrDrawState::kMaxVertexAttribCnt <= currAttribIndex && kAttribute_ColorInput == header->fColorInput); header->fColorAttributeIndex = (header->fColorInput == kAttribute_ColorInput) ? currAttribIndex++ : -1; do { header->fCoverageInput = static_cast<GrGLProgramDesc::ColorInput>( random->nextULessThan(kColorInputCnt)); } while (GrDrawState::kMaxVertexAttribCnt <= currAttribIndex && kAttribute_ColorInput == header->fCoverageInput); header->fCoverageAttributeIndex = (header->fCoverageInput == kAttribute_ColorInput) ? currAttribIndex++ : -1; #if GR_GL_EXPERIMENTAL_GS header->fExperimentalGS = gpu->caps()->geometryShaderSupport() && random->nextBool(); #endif bool useLocalCoords = random->nextBool() && currAttribIndex < GrDrawState::kMaxVertexAttribCnt; header->fLocalCoordAttributeIndex = useLocalCoords ? currAttribIndex++ : -1; header->fColorEffectCnt = numColorStages; header->fCoverageEffectCnt = numCoverageStages; bool dstRead = false; bool fragPos = false; bool vertexCode = false; int numStages = numColorStages + numCoverageStages; for (int s = 0; s < numStages; ++s) { const GrBackendEffectFactory& factory = (*stages[s]->getEffect())->getFactory(); GrDrawEffect drawEffect(*stages[s], useLocalCoords); this->effectKeys()[s] = factory.glEffectKey(drawEffect, gpu->glCaps()); if ((*stages[s]->getEffect())->willReadDstColor()) { dstRead = true; } if ((*stages[s]->getEffect())->willReadFragmentPosition()) { fragPos = true; } if ((*stages[s]->getEffect())->hasVertexCode()) { vertexCode = true; } } if (dstRead) { header->fDstReadKey = GrGLShaderBuilder::KeyForDstRead(dstCopyTexture, gpu->glCaps()); } else { header->fDstReadKey = 0; } if (fragPos) { header->fFragPosKey = GrGLShaderBuilder::KeyForFragmentPosition(dstRenderTarget, gpu->glCaps()); } else { header->fFragPosKey = 0; } header->fHasVertexCode = vertexCode || useLocalCoords || kAttribute_ColorInput == header->fColorInput || kAttribute_ColorInput == header->fCoverageInput; CoverageOutput coverageOutput; bool illegalCoverageOutput; do { coverageOutput = static_cast<CoverageOutput>(random->nextULessThan(kCoverageOutputCnt)); illegalCoverageOutput = (!gpu->caps()->dualSourceBlendingSupport() && CoverageOutputUsesSecondaryOutput(coverageOutput)) || (!dstRead && kCombineWithDst_CoverageOutput == coverageOutput); } while (illegalCoverageOutput); header->fCoverageOutput = coverageOutput; *this->checksum() = 0; *this->checksum() = SkChecksum::Compute(reinterpret_cast<uint32_t*>(fKey.get()), keyLength); fInitialized = true; }
void GrGLProgramDesc::Build(const GrDrawState& drawState, bool isPoints, GrDrawState::BlendOptFlags blendOpts, GrBlendCoeff srcCoeff, GrBlendCoeff dstCoeff, const GrGpuGL* gpu, const GrDeviceCoordTexture* dstCopy, GrGLProgramDesc* desc) { // This should already have been caught GrAssert(!(GrDrawState::kSkipDraw_BlendOptFlag & blendOpts)); bool skipCoverage = SkToBool(blendOpts & GrDrawState::kEmitTransBlack_BlendOptFlag); bool skipColor = SkToBool(blendOpts & (GrDrawState::kEmitTransBlack_BlendOptFlag | GrDrawState::kEmitCoverage_BlendOptFlag)); // The descriptor is used as a cache key. Thus when a field of the // descriptor will not affect program generation (because of the attribute // bindings in use or other descriptor field settings) it should be set // to a canonical value to avoid duplicate programs with different keys. desc->fEmitsPointSize = isPoints; bool requiresColorAttrib = !skipColor && drawState.hasColorVertexAttribute(); bool requiresCoverageAttrib = !skipCoverage && drawState.hasCoverageVertexAttribute(); // we only need the local coords if we're actually going to generate effect code bool requiresLocalCoordAttrib = !(skipCoverage && skipColor) && drawState.hasLocalCoordAttribute(); // fColorInput/fCoverageInput records how colors are specified for the program so we strip the // bits from the bindings to avoid false negatives when searching for an existing program in the // cache. desc->fColorFilterXfermode = skipColor ? SkXfermode::kDst_Mode : drawState.getColorFilterMode(); bool colorIsTransBlack = SkToBool(blendOpts & GrDrawState::kEmitTransBlack_BlendOptFlag); bool colorIsSolidWhite = (blendOpts & GrDrawState::kEmitCoverage_BlendOptFlag) || (!requiresColorAttrib && 0xffffffff == drawState.getColor()); if (colorIsTransBlack) { desc->fColorInput = kTransBlack_ColorInput; } else if (colorIsSolidWhite) { desc->fColorInput = kSolidWhite_ColorInput; } else if (GR_GL_NO_CONSTANT_ATTRIBUTES && !requiresColorAttrib) { desc->fColorInput = kUniform_ColorInput; } else { desc->fColorInput = kAttribute_ColorInput; } bool covIsSolidWhite = !requiresCoverageAttrib && 0xffffffff == drawState.getCoverage(); if (skipCoverage) { desc->fCoverageInput = kTransBlack_ColorInput; } else if (covIsSolidWhite) { desc->fCoverageInput = kSolidWhite_ColorInput; } else if (GR_GL_NO_CONSTANT_ATTRIBUTES && !requiresCoverageAttrib) { desc->fCoverageInput = kUniform_ColorInput; } else { desc->fCoverageInput = kAttribute_ColorInput; } bool readsDst = false; int lastEnabledStage = -1; for (int s = 0; s < GrDrawState::kNumStages; ++s) { bool skip = s < drawState.getFirstCoverageStage() ? skipColor : skipCoverage; if (!skip && drawState.isStageEnabled(s)) { lastEnabledStage = s; const GrEffectRef& effect = *drawState.getStage(s).getEffect(); const GrBackendEffectFactory& factory = effect->getFactory(); GrDrawEffect drawEffect(drawState.getStage(s), requiresLocalCoordAttrib); desc->fEffectKeys[s] = factory.glEffectKey(drawEffect, gpu->glCaps()); if (effect->willReadDst()) { readsDst = true; } } else { desc->fEffectKeys[s] = 0; } } if (readsDst) { GrAssert(NULL != dstCopy); desc->fDstRead = GrGLShaderBuilder::KeyForDstRead(dstCopy->texture(), gpu->glCaps()); GrAssert(0 != desc->fDstRead); } else { desc->fDstRead = 0; } desc->fCoverageOutput = kModulate_CoverageOutput; // Currently the experimental GS will only work with triangle prims (and it doesn't do anything // other than pass through values from the VS to the FS anyway). #if GR_GL_EXPERIMENTAL_GS #if 0 desc->fExperimentalGS = gpu->caps().geometryShaderSupport(); #else desc->fExperimentalGS = false; #endif #endif // We leave this set to kNumStages until we discover that the coverage/color distinction is // material to the generated program. We do this to avoid distinct keys that generate equivalent // programs. desc->fFirstCoverageStage = GrDrawState::kNumStages; // This tracks the actual first coverage stage. int firstCoverageStage = GrDrawState::kNumStages; desc->fDiscardIfZeroCoverage = false; // Enabled below if stenciling and there is coverage. bool hasCoverage = false; // If we're rendering coverage-as-color then it's as though there are no coverage stages. if (!drawState.isCoverageDrawing()) { // We can have coverage either through a stage or coverage vertex attributes. if (drawState.getFirstCoverageStage() <= lastEnabledStage) { firstCoverageStage = drawState.getFirstCoverageStage(); hasCoverage = true; } else { hasCoverage = requiresCoverageAttrib; } } if (hasCoverage) { // color filter is applied between color/coverage computation if (SkXfermode::kDst_Mode != desc->fColorFilterXfermode) { desc->fFirstCoverageStage = firstCoverageStage; } // If we're stenciling then we want to discard samples that have zero coverage if (drawState.getStencil().doesWrite()) { desc->fDiscardIfZeroCoverage = true; desc->fFirstCoverageStage = firstCoverageStage; } if (gpu->caps()->dualSourceBlendingSupport() && !(blendOpts & (GrDrawState::kEmitCoverage_BlendOptFlag | GrDrawState::kCoverageAsAlpha_BlendOptFlag))) { if (kZero_GrBlendCoeff == dstCoeff) { // write the coverage value to second color desc->fCoverageOutput = kSecondaryCoverage_CoverageOutput; desc->fFirstCoverageStage = firstCoverageStage; } else if (kSA_GrBlendCoeff == dstCoeff) { // SA dst coeff becomes 1-(1-SA)*coverage when dst is partially covered. desc->fCoverageOutput = kSecondaryCoverageISA_CoverageOutput; desc->fFirstCoverageStage = firstCoverageStage; } else if (kSC_GrBlendCoeff == dstCoeff) { // SA dst coeff becomes 1-(1-SA)*coverage when dst is partially covered. desc->fCoverageOutput = kSecondaryCoverageISC_CoverageOutput; desc->fFirstCoverageStage = firstCoverageStage; } } else if (readsDst && kOne_GrBlendCoeff == drawState.getSrcBlendCoeff() && kZero_GrBlendCoeff == drawState.getDstBlendCoeff()) { desc->fCoverageOutput = kCombineWithDst_CoverageOutput; desc->fFirstCoverageStage = firstCoverageStage; } } desc->fPositionAttributeIndex = drawState.positionAttributeIndex(); desc->fLocalCoordAttributeIndex = drawState.localCoordAttributeIndex(); // For constant color and coverage we need an attribute with an index beyond those already set int availableAttributeIndex = drawState.getVertexAttribCount(); if (requiresColorAttrib) { desc->fColorAttributeIndex = drawState.colorVertexAttributeIndex(); } else if (GrGLProgramDesc::kAttribute_ColorInput == desc->fColorInput) { GrAssert(availableAttributeIndex < GrDrawState::kMaxVertexAttribCnt); desc->fColorAttributeIndex = availableAttributeIndex; availableAttributeIndex++; } else { desc->fColorAttributeIndex = -1; } if (requiresCoverageAttrib) { desc->fCoverageAttributeIndex = drawState.coverageVertexAttributeIndex(); } else if (GrGLProgramDesc::kAttribute_ColorInput == desc->fCoverageInput) { GrAssert(availableAttributeIndex < GrDrawState::kMaxVertexAttribCnt); desc->fCoverageAttributeIndex = availableAttributeIndex; } else { desc->fCoverageAttributeIndex = -1; } }
int PonscripterLabel::doEffect(Effect& effect, bool clear_dirty_region) { int prevduration = effect.duration; if (ctrl_pressed_status || skip_to_wait) { effect.duration = effect_counter = 1; } effect_start_time = SDL_GetTicks(); effect_timer_resolution = effect_start_time - effect_start_time_old; effect_start_time_old = effect_start_time; int effect_no = effect.effect; if (effect_cut_flag && skip_flag) effect_no = 1; int i; int width, width2; int height, height2; SDL_Rect src_rect = { 0, 0, screen_width, screen_height }; SDL_Rect dst_rect = { 0, 0, screen_width, screen_height }; /* ---------------------------------------- */ /* Execute effect */ //printf("Effect number %d %d\n", effect_no, effect->duration ); switch (effect_no) { case 0: // Instant display case 1: // Instant display //drawEffect( &src_rect, &src_rect, effect_dst_surface ); break; case 2: // Left shutter width = EFFECT_STRIPE_WIDTH * effect_counter / effect.duration; for (i = 0; i < screen_width / EFFECT_STRIPE_WIDTH; i++) { src_rect.x = i * EFFECT_STRIPE_WIDTH; src_rect.y = 0; src_rect.w = width; src_rect.h = screen_height; drawEffect(&src_rect, &src_rect, effect_dst_surface); } break; case 3: // Right shutter width = EFFECT_STRIPE_WIDTH * effect_counter / effect.duration; for (i = 1; i <= screen_width / EFFECT_STRIPE_WIDTH; i++) { src_rect.x = i * EFFECT_STRIPE_WIDTH - width - 1; src_rect.y = 0; src_rect.w = width; src_rect.h = screen_height; drawEffect(&src_rect, &src_rect, effect_dst_surface); } break; case 4: // Top shutter height = EFFECT_STRIPE_WIDTH * effect_counter / effect.duration; for (i = 0; i < screen_height / EFFECT_STRIPE_WIDTH; i++) { src_rect.x = 0; src_rect.y = i * EFFECT_STRIPE_WIDTH; src_rect.w = screen_width; src_rect.h = height; drawEffect(&src_rect, &src_rect, effect_dst_surface); } break; case 5: // Bottom shutter height = EFFECT_STRIPE_WIDTH * effect_counter / effect.duration; for (i = 1; i <= screen_height / EFFECT_STRIPE_WIDTH; i++) { src_rect.x = 0; src_rect.y = i * EFFECT_STRIPE_WIDTH - height - 1; src_rect.w = screen_width; src_rect.h = height; drawEffect(&src_rect, &src_rect, effect_dst_surface); } break; case 6: // Left curtain width = EFFECT_STRIPE_CURTAIN_WIDTH * effect_counter * 2 / effect.duration; for (i = 0; i <= screen_width / EFFECT_STRIPE_CURTAIN_WIDTH; i++) { width2 = width - EFFECT_STRIPE_CURTAIN_WIDTH * EFFECT_STRIPE_CURTAIN_WIDTH * i / screen_width; if (width2 >= 0) { src_rect.x = i * EFFECT_STRIPE_CURTAIN_WIDTH; src_rect.y = 0; src_rect.w = width2; src_rect.h = screen_height; drawEffect(&src_rect, &src_rect, effect_dst_surface); } } break; case 7: // Right curtain width = EFFECT_STRIPE_CURTAIN_WIDTH * effect_counter * 2 / effect.duration; for (i = 0; i <= screen_width / EFFECT_STRIPE_CURTAIN_WIDTH; i++) { width2 = width - EFFECT_STRIPE_CURTAIN_WIDTH * EFFECT_STRIPE_CURTAIN_WIDTH * i / screen_width; if (width2 >= 0) { if (width2 > EFFECT_STRIPE_CURTAIN_WIDTH) width2 = EFFECT_STRIPE_CURTAIN_WIDTH; src_rect.x = screen_width - i * EFFECT_STRIPE_CURTAIN_WIDTH - width2; src_rect.y = 0; src_rect.w = width2; src_rect.h = screen_height; drawEffect(&src_rect, &src_rect, effect_dst_surface); } } break; case 8: // Top curtain height = EFFECT_STRIPE_CURTAIN_WIDTH * effect_counter * 2 / effect.duration; for (i = 0; i <= screen_height / EFFECT_STRIPE_CURTAIN_WIDTH; i++) { height2 = height - EFFECT_STRIPE_CURTAIN_WIDTH * EFFECT_STRIPE_CURTAIN_WIDTH * i / screen_height; if (height2 >= 0) { src_rect.x = 0; src_rect.y = i * EFFECT_STRIPE_CURTAIN_WIDTH; src_rect.w = screen_width; src_rect.h = height2; drawEffect(&src_rect, &src_rect, effect_dst_surface); } } break; case 9: // Bottom curtain height = EFFECT_STRIPE_CURTAIN_WIDTH * effect_counter * 2 / effect.duration; for (i = 0; i <= screen_height / EFFECT_STRIPE_CURTAIN_WIDTH; i++) { height2 = height - EFFECT_STRIPE_CURTAIN_WIDTH * EFFECT_STRIPE_CURTAIN_WIDTH * i / screen_height; if (height2 >= 0) { src_rect.x = 0; src_rect.y = screen_height - i * EFFECT_STRIPE_CURTAIN_WIDTH - height2; src_rect.w = screen_width; src_rect.h = height2; drawEffect(&src_rect, &src_rect, effect_dst_surface); } } break; default: printf("effect No. %d is not implemented. Crossfade is substituted for that.\n", effect_no); case 10: // Cross fade height = 256 * effect_counter / effect.duration; alphaMaskBlend(NULL, ALPHA_BLEND_CONST, height, &dirty_rect.bounding_box); break; case 11: // Left scroll width = screen_width * effect_counter / effect.duration; src_rect.x = 0; dst_rect.x = width; src_rect.y = dst_rect.y = 0; src_rect.w = dst_rect.w = screen_width - width; src_rect.h = dst_rect.h = screen_height; drawEffect(&dst_rect, &src_rect, effect_src_surface); src_rect.x = screen_width - width - 1; dst_rect.x = 0; src_rect.y = dst_rect.y = 0; src_rect.w = dst_rect.w = width; src_rect.h = dst_rect.h = screen_height; drawEffect(&dst_rect, &src_rect, effect_dst_surface); break; case 12: // Right scroll width = screen_width * effect_counter / effect.duration; src_rect.x = width; dst_rect.x = 0; src_rect.y = dst_rect.y = 0; src_rect.w = dst_rect.w = screen_width - width; src_rect.h = dst_rect.h = screen_height; drawEffect(&dst_rect, &src_rect, effect_src_surface); src_rect.x = 0; dst_rect.x = screen_width - width - 1; src_rect.y = dst_rect.y = 0; src_rect.w = dst_rect.w = width; src_rect.h = dst_rect.h = screen_height; drawEffect(&dst_rect, &src_rect, effect_dst_surface); break; case 13: // Top scroll width = screen_height * effect_counter / effect.duration; src_rect.x = dst_rect.x = 0; src_rect.y = 0; dst_rect.y = width; src_rect.w = dst_rect.w = screen_width; src_rect.h = dst_rect.h = screen_height - width; drawEffect(&dst_rect, &src_rect, effect_src_surface); src_rect.x = dst_rect.x = 0; src_rect.y = screen_height - width - 1; dst_rect.y = 0; src_rect.w = dst_rect.w = screen_width; src_rect.h = dst_rect.h = width; drawEffect(&dst_rect, &src_rect, effect_dst_surface); break; case 14: // Bottom scroll width = screen_height * effect_counter / effect.duration; src_rect.x = dst_rect.x = 0; src_rect.y = width; dst_rect.y = 0; src_rect.w = dst_rect.w = screen_width; src_rect.h = dst_rect.h = screen_height - width; drawEffect(&dst_rect, &src_rect, effect_src_surface); src_rect.x = dst_rect.x = 0; src_rect.y = 0; dst_rect.y = screen_height - width - 1; src_rect.w = dst_rect.w = screen_width; src_rect.h = dst_rect.h = width; drawEffect(&dst_rect, &src_rect, effect_dst_surface); break; case 15: // Fade with mask alphaMaskBlend(effect.anim.image_surface, ALPHA_BLEND_FADE_MASK, 256 * effect_counter / effect.duration, &dirty_rect.bounding_box); break; case 16: // Mosaic out generateMosaic(effect_src_surface, 5 - 6 * effect_counter / effect.duration); break; case 17: // Mosaic in generateMosaic(effect_dst_surface, 6 * effect_counter / effect.duration); break; case 18: // Cross fade with mask alphaMaskBlend(effect.anim.image_surface, ALPHA_BLEND_CROSSFADE_MASK, 256 * effect_counter * 2 / effect.duration, &dirty_rect.bounding_box); break; case (CUSTOM_EFFECT_NO + 0): // quakey if (effect_timer_resolution > effect.duration / 4 / effect.no) effect_timer_resolution = effect.duration / 4 / effect.no; dst_rect.x = 0; dst_rect.y = (Sint16) (sin(M_PI * 2.0 * effect.no * effect_counter / effect.duration) * EFFECT_QUAKE_AMP * effect.no * (effect.duration - effect_counter) / effect.duration); SDL_FillRect(accumulation_surface, NULL, SDL_MapRGBA(accumulation_surface->format, 0, 0, 0, 0xff)); drawEffect(&dst_rect, &src_rect, effect_dst_surface); break; case (CUSTOM_EFFECT_NO + 1): // quakex if (effect_timer_resolution > effect.duration / 4 / effect.no) effect_timer_resolution = effect.duration / 4 / effect.no; dst_rect.x = (Sint16) (sin(M_PI * 2.0 * effect.no * effect_counter / effect.duration) * EFFECT_QUAKE_AMP * effect.no * (effect.duration - effect_counter) / effect.duration); dst_rect.y = 0; drawEffect(&dst_rect, &src_rect, effect_dst_surface); break; case (CUSTOM_EFFECT_NO + 2): // quake dst_rect.x = effect.no * get_rnd(-1, 1) * 2; dst_rect.y = effect.no * get_rnd(-1, 1) * 2; SDL_FillRect(accumulation_surface, NULL, SDL_MapRGBA(accumulation_surface->format, 0, 0, 0, 0xff)); drawEffect(&dst_rect, &src_rect, effect_dst_surface); break; } //printf("effect conut %d / dur %d\n", effect_counter, effect.duration); effect_counter += effect_timer_resolution; if (effect_counter < effect.duration && effect_no != 1) { if (effect_no) flush(REFRESH_NONE_MODE, NULL, false); effect.duration = prevduration; return RET_WAIT | RET_REREAD; } else { SDL_BlitSurface(effect_dst_surface, &dirty_rect.bounding_box, accumulation_surface, &dirty_rect.bounding_box); if (effect_no) flush(REFRESH_NONE_MODE, NULL, clear_dirty_region); if (effect_no == 1) effect_counter = 0; effect.duration = prevduration; event_mode = IDLE_EVENT_MODE; return RET_CONTINUE; } }
bool ONScripter::doEffect( EffectLink *effect, bool clear_dirty_region ) { effect_start_time = SDL_GetTicks(); if ( effect_counter == 0 ) effect_start_time_old = effect_start_time - 1; //printf("effect_counter %d timer between %d %d\n",effect_counter,effect_start_time,effect_start_time_old); effect_timer_resolution = effect_start_time - effect_start_time_old; effect_start_time_old = effect_start_time; int effect_no = effect->effect; if (effect_cut_flag && (skip_mode & SKIP_NORMAL || ctrl_pressed_status)) effect_no = 1; int i, amp; int width, width2; int height, height2; SDL_Rect src_rect = screen_rect, dst_rect = screen_rect; SDL_Rect quake_rect = screen_rect; /* ---------------------------------------- */ /* Execute effect */ //printf("Effect number %d %d\n", effect_no, effect_duration ); bool not_implemented = false; switch ( effect_no ){ case 0: // Instant display case 1: // Instant display //drawEffect( &src_rect, &src_rect, effect_dst_surface ); break; case 2: // Left shutter width = EFFECT_STRIPE_WIDTH * effect_counter / effect_duration; for ( i=0 ; i<screen_width/EFFECT_STRIPE_WIDTH ; i++ ){ src_rect.x = i * EFFECT_STRIPE_WIDTH; src_rect.y = 0; src_rect.w = width; src_rect.h = screen_height; drawEffect(&src_rect, &src_rect, effect_dst_surface); } break; case 3: // Right shutter width = EFFECT_STRIPE_WIDTH * effect_counter / effect_duration; for ( i=1 ; i<=screen_width/EFFECT_STRIPE_WIDTH ; i++ ){ src_rect.x = i * EFFECT_STRIPE_WIDTH - width - 1; src_rect.y = 0; src_rect.w = width; src_rect.h = screen_height; drawEffect(&src_rect, &src_rect, effect_dst_surface); } break; case 4: // Top shutter height = EFFECT_STRIPE_WIDTH * effect_counter / effect_duration; for ( i=0 ; i<screen_height/EFFECT_STRIPE_WIDTH ; i++ ){ src_rect.x = 0; src_rect.y = i * EFFECT_STRIPE_WIDTH; src_rect.w = screen_width; src_rect.h = height; drawEffect(&src_rect, &src_rect, effect_dst_surface); } break; case 5: // Bottom shutter height = EFFECT_STRIPE_WIDTH * effect_counter / effect_duration; for ( i=1 ; i<=screen_height/EFFECT_STRIPE_WIDTH ; i++ ){ src_rect.x = 0; src_rect.y = i * EFFECT_STRIPE_WIDTH - height - 1; src_rect.w = screen_width; src_rect.h = height; drawEffect(&src_rect, &src_rect, effect_dst_surface); } break; case 6: // Left curtain width = EFFECT_STRIPE_CURTAIN_WIDTH * effect_counter * 2 / effect_duration; for ( i=0 ; i<=screen_width/EFFECT_STRIPE_CURTAIN_WIDTH ; i++ ){ width2 = width - EFFECT_STRIPE_CURTAIN_WIDTH * EFFECT_STRIPE_CURTAIN_WIDTH * i / screen_width; if ( width2 >= 0 ){ src_rect.x = i * EFFECT_STRIPE_CURTAIN_WIDTH; src_rect.y = 0; src_rect.w = width2; src_rect.h = screen_height; drawEffect(&src_rect, &src_rect, effect_dst_surface); } } break; case 7: // Right curtain width = EFFECT_STRIPE_CURTAIN_WIDTH * effect_counter * 2 / effect_duration; for ( i=0 ; i<=screen_width/EFFECT_STRIPE_CURTAIN_WIDTH ; i++ ){ width2 = width - EFFECT_STRIPE_CURTAIN_WIDTH * EFFECT_STRIPE_CURTAIN_WIDTH * i / screen_width; if ( width2 >= 0 ){ if ( width2 > EFFECT_STRIPE_CURTAIN_WIDTH ) width2 = EFFECT_STRIPE_CURTAIN_WIDTH; src_rect.x = screen_width - i * EFFECT_STRIPE_CURTAIN_WIDTH - width2; src_rect.y = 0; src_rect.w = width2; src_rect.h = screen_height; drawEffect(&src_rect, &src_rect, effect_dst_surface); } } break; case 8: // Top curtain height = EFFECT_STRIPE_CURTAIN_WIDTH * effect_counter * 2 / effect_duration; for ( i=0 ; i<=screen_height/EFFECT_STRIPE_CURTAIN_WIDTH ; i++ ){ height2 = height - EFFECT_STRIPE_CURTAIN_WIDTH * EFFECT_STRIPE_CURTAIN_WIDTH * i / screen_height; if ( height2 >= 0 ){ src_rect.x = 0; src_rect.y = i * EFFECT_STRIPE_CURTAIN_WIDTH; src_rect.w = screen_width; src_rect.h = height2; drawEffect(&src_rect, &src_rect, effect_dst_surface); } } break; case 9: // Bottom curtain height = EFFECT_STRIPE_CURTAIN_WIDTH * effect_counter * 2 / effect_duration; for ( i=0 ; i<=screen_height/EFFECT_STRIPE_CURTAIN_WIDTH ; i++ ){ height2 = height - EFFECT_STRIPE_CURTAIN_WIDTH * EFFECT_STRIPE_CURTAIN_WIDTH * i / screen_height; if ( height2 >= 0 ){ src_rect.x = 0; src_rect.y = screen_height - i * EFFECT_STRIPE_CURTAIN_WIDTH - height2; src_rect.w = screen_width; src_rect.h = height2; drawEffect(&src_rect, &src_rect, effect_dst_surface); } } break; default: not_implemented = true; case 10: // Cross fade height = 256 * effect_counter / effect_duration; alphaBlend( NULL, ALPHA_BLEND_CONST, height, &dirty_rect.bounding_box ); break; case 11: // Left scroll width = screen_width * effect_counter / effect_duration; src_rect.x = 0; dst_rect.x = width; src_rect.y = dst_rect.y = 0; src_rect.w = dst_rect.w = screen_width - width; src_rect.h = dst_rect.h = screen_height; drawEffect(&dst_rect, &src_rect, effect_src_surface); src_rect.x = screen_width - width - 1; dst_rect.x = 0; src_rect.y = dst_rect.y = 0; src_rect.w = dst_rect.w = width; src_rect.h = dst_rect.h = screen_height; drawEffect(&dst_rect, &src_rect, effect_dst_surface); break; case 12: // Right scroll width = screen_width * effect_counter / effect_duration; src_rect.x = width; dst_rect.x = 0; src_rect.y = dst_rect.y = 0; src_rect.w = dst_rect.w = screen_width - width; src_rect.h = dst_rect.h = screen_height; drawEffect(&dst_rect, &src_rect, effect_src_surface); src_rect.x = 0; dst_rect.x = screen_width - width - 1; src_rect.y = dst_rect.y = 0; src_rect.w = dst_rect.w = width; src_rect.h = dst_rect.h = screen_height; drawEffect(&dst_rect, &src_rect, effect_dst_surface); break; case 13: // Top scroll width = screen_height * effect_counter / effect_duration; src_rect.x = dst_rect.x = 0; src_rect.y = 0; dst_rect.y = width; src_rect.w = dst_rect.w = screen_width; src_rect.h = dst_rect.h = screen_height - width; drawEffect(&dst_rect, &src_rect, effect_src_surface); src_rect.x = dst_rect.x = 0; src_rect.y = screen_height - width - 1; dst_rect.y = 0; src_rect.w = dst_rect.w = screen_width; src_rect.h = dst_rect.h = width; drawEffect(&dst_rect, &src_rect, effect_dst_surface); break; case 14: // Bottom scroll width = screen_height * effect_counter / effect_duration; src_rect.x = dst_rect.x = 0; src_rect.y = width; dst_rect.y = 0; src_rect.w = dst_rect.w = screen_width; src_rect.h = dst_rect.h = screen_height - width; drawEffect(&dst_rect, &src_rect, effect_src_surface); src_rect.x = dst_rect.x = 0; src_rect.y = 0; dst_rect.y = screen_height - width - 1; src_rect.w = dst_rect.w = screen_width; src_rect.h = dst_rect.h = width; drawEffect(&dst_rect, &src_rect, effect_dst_surface); break; case 15: // Fade with mask alphaBlend( effect->anim.image_surface, ALPHA_BLEND_FADE_MASK, 256 * effect_counter / effect_duration, &dirty_rect.bounding_box ); break; case 16: // Mosaic out generateMosaic( effect_src_surface, 5 - 6 * effect_counter / effect_duration ); break; case 17: // Mosaic in generateMosaic( effect_dst_surface, 6 * effect_counter / effect_duration ); break; case 18: // Cross fade with mask alphaBlend( effect->anim.image_surface, ALPHA_BLEND_CROSSFADE_MASK, 256 * effect_counter * 2 / effect_duration, &dirty_rect.bounding_box ); break; case (MAX_EFFECT_NUM + 0): // quakey if ( effect_timer_resolution > effect_duration / 4 / effect->no ) effect_timer_resolution = effect_duration / 4 / effect->no; amp = (Sint16)(sin(M_PI * 2.0 * effect->no * effect_counter / effect_duration) * EFFECT_QUAKE_AMP * effect->no * (effect_duration - effect_counter) / effect_duration); dst_rect.x = 0; dst_rect.y = amp; drawEffect(&dst_rect, &src_rect, effect_dst_surface); if (amp >= 0){ quake_rect.y = 0; quake_rect.h = amp; } else{ quake_rect.y = screen_height + amp; quake_rect.h = -amp; } SDL_FillRect( accumulation_surface, &quake_rect, SDL_MapRGBA( accumulation_surface->format, 0, 0, 0, 0xff ) ); break; case (MAX_EFFECT_NUM + 1): // quakex if ( effect_timer_resolution > effect_duration / 4 / effect->no ) effect_timer_resolution = effect_duration / 4 / effect->no; amp = (Sint16)(sin(M_PI * 2.0 * effect->no * effect_counter / effect_duration) * EFFECT_QUAKE_AMP * effect->no * (effect_duration - effect_counter) / effect_duration); dst_rect.x = amp; dst_rect.y = 0; drawEffect(&dst_rect, &src_rect, effect_dst_surface); if (amp >= 0){ quake_rect.x = 0; quake_rect.w = amp; } else{ quake_rect.x = screen_width + amp; quake_rect.w = -amp; } SDL_FillRect( accumulation_surface, &quake_rect, SDL_MapRGBA( accumulation_surface->format, 0, 0, 0, 0xff ) ); break; case (MAX_EFFECT_NUM + 2): // quake dst_rect.x = effect->no*((int)(3.0*rand()/(RAND_MAX+1.0)) - 1) * 2; dst_rect.y = effect->no*((int)(3.0*rand()/(RAND_MAX+1.0)) - 1) * 2; SDL_FillRect( accumulation_surface, NULL, SDL_MapRGBA( accumulation_surface->format, 0, 0, 0, 0xff ) ); drawEffect(&dst_rect, &src_rect, effect_dst_surface); break; case 99: // dll-based if (effect->anim.image_name != NULL){ if (!strncmp(effect->anim.image_name, "breakup.dll", 11)){ effectBreakup(effect->anim.image_name, effect_duration); } else { // do crossfade height = 256 * effect_counter / effect_duration; alphaBlend( NULL, ALPHA_BLEND_CONST, height, &dirty_rect.bounding_box ); not_implemented = true; } } else { //just in case no dll is given // do crossfade height = 256 * effect_counter / effect_duration; alphaBlend( NULL, ALPHA_BLEND_CONST, height, &dirty_rect.bounding_box ); not_implemented = true; } break; } if (effect_counter == 0 && not_implemented) logw(stderr, "effect No. %d not implemented; substituting crossfade\n", effect_no); //printf("effect conut %d / dur %d\n", effect_counter, effect_duration); effect_counter += effect_timer_resolution; event_mode = WAIT_INPUT_MODE; waitEvent(0); if ( !((automode_flag || autoclick_time > 0) || (usewheel_flag && current_button_state.button == -5) || (!usewheel_flag && current_button_state.button == -2)) ){ effect_counter = effect_duration; // interrupted } if ( effect_counter < effect_duration && effect_no != 1 ){ if ( effect_no != 0 ) flush( REFRESH_NONE_MODE, NULL, false ); return true; } else{ SDL_BlitSurface( effect_dst_surface, &dirty_rect.bounding_box, accumulation_surface, &dirty_rect.bounding_box ); if ( effect_no != 0 ) flush(REFRESH_NONE_MODE, NULL, clear_dirty_region); if ( effect_no == 1 ) effect_counter = 0; skip_mode &= ~SKIP_TO_EOL; event_mode = IDLE_EVENT_MODE; if (effect_blank != 0 && effect_counter != 0) waitEvent(effect_blank); return false; } }
bool ONScripterLabel::doEffect( EffectLink *effect, bool clear_dirty_region ) { bool first_time = (effect_counter == 0); effect_start_time = SDL_GetTicks(); effect_timer_resolution = effect_start_time - effect_start_time_old; effect_start_time_old = effect_start_time; int effect_no = effect->effect; if (first_time) { if ( (effect_cut_flag && ( ctrl_pressed_status || skip_mode & SKIP_NORMAL )) || (effectspeed == EFFECTSPEED_INSTANT) ) effect_no = 1; } skip_effect = false; int i, amp; int width, width2; int height, height2; SDL_Rect src_rect={0, 0, screen_width, screen_height}; SDL_Rect dst_rect={0, 0, screen_width, screen_height}; SDL_Rect quake_rect={0, 0, screen_width, screen_height}; /* ---------------------------------------- */ /* Execute effect */ if (debug_level > 0 && first_time) printf("Effect number %d, %d ms\n", effect_no, effect_duration ); bool not_implemented = false; switch ( effect_no ){ case 0: // Instant display case 1: // Instant display //drawEffect( &src_rect, &src_rect, effect_dst_surface ); break; case 2: // Left shutter width = EFFECT_STRIPE_WIDTH * effect_counter / effect_duration; for ( i=0 ; i<screen_width/EFFECT_STRIPE_WIDTH ; i++ ){ src_rect.x = i * EFFECT_STRIPE_WIDTH; src_rect.y = 0; src_rect.w = width; src_rect.h = screen_height; drawEffect(&src_rect, &src_rect, effect_dst_surface); } break; case 3: // Right shutter width = EFFECT_STRIPE_WIDTH * effect_counter / effect_duration; for ( i=1 ; i<=screen_width/EFFECT_STRIPE_WIDTH ; i++ ){ src_rect.x = i * EFFECT_STRIPE_WIDTH - width - 1; src_rect.y = 0; src_rect.w = width; src_rect.h = screen_height; drawEffect(&src_rect, &src_rect, effect_dst_surface); } break; case 4: // Top shutter height = EFFECT_STRIPE_WIDTH * effect_counter / effect_duration; for ( i=0 ; i<screen_height/EFFECT_STRIPE_WIDTH ; i++ ){ src_rect.x = 0; src_rect.y = i * EFFECT_STRIPE_WIDTH; src_rect.w = screen_width; src_rect.h = height; drawEffect(&src_rect, &src_rect, effect_dst_surface); } break; case 5: // Bottom shutter height = EFFECT_STRIPE_WIDTH * effect_counter / effect_duration; for ( i=1 ; i<=screen_height/EFFECT_STRIPE_WIDTH ; i++ ){ src_rect.x = 0; src_rect.y = i * EFFECT_STRIPE_WIDTH - height - 1; src_rect.w = screen_width; src_rect.h = height; drawEffect(&src_rect, &src_rect, effect_dst_surface); } break; case 6: // Left curtain width = EFFECT_STRIPE_CURTAIN_WIDTH * effect_counter * 2 / effect_duration; for ( i=0 ; i<=screen_width/EFFECT_STRIPE_CURTAIN_WIDTH ; i++ ){ width2 = width - EFFECT_STRIPE_CURTAIN_WIDTH * EFFECT_STRIPE_CURTAIN_WIDTH * i / screen_width; if ( width2 >= 0 ){ src_rect.x = i * EFFECT_STRIPE_CURTAIN_WIDTH; src_rect.y = 0; src_rect.w = width2; src_rect.h = screen_height; drawEffect(&src_rect, &src_rect, effect_dst_surface); } } break; case 7: // Right curtain width = EFFECT_STRIPE_CURTAIN_WIDTH * effect_counter * 2 / effect_duration; for ( i=0 ; i<=screen_width/EFFECT_STRIPE_CURTAIN_WIDTH ; i++ ){ width2 = width - EFFECT_STRIPE_CURTAIN_WIDTH * EFFECT_STRIPE_CURTAIN_WIDTH * i / screen_width; if ( width2 >= 0 ){ if ( width2 > EFFECT_STRIPE_CURTAIN_WIDTH ) width2 = EFFECT_STRIPE_CURTAIN_WIDTH; src_rect.x = screen_width - i * EFFECT_STRIPE_CURTAIN_WIDTH - width2; src_rect.y = 0; src_rect.w = width2; src_rect.h = screen_height; drawEffect(&src_rect, &src_rect, effect_dst_surface); } } break; case 8: // Top curtain height = EFFECT_STRIPE_CURTAIN_WIDTH * effect_counter * 2 / effect_duration; for ( i=0 ; i<=screen_height/EFFECT_STRIPE_CURTAIN_WIDTH ; i++ ){ height2 = height - EFFECT_STRIPE_CURTAIN_WIDTH * EFFECT_STRIPE_CURTAIN_WIDTH * i / screen_height; if ( height2 >= 0 ){ src_rect.x = 0; src_rect.y = i * EFFECT_STRIPE_CURTAIN_WIDTH; src_rect.w = screen_width; src_rect.h = height2; drawEffect(&src_rect, &src_rect, effect_dst_surface); } } break; case 9: // Bottom curtain height = EFFECT_STRIPE_CURTAIN_WIDTH * effect_counter * 2 / effect_duration; for ( i=0 ; i<=screen_height/EFFECT_STRIPE_CURTAIN_WIDTH ; i++ ){ height2 = height - EFFECT_STRIPE_CURTAIN_WIDTH * EFFECT_STRIPE_CURTAIN_WIDTH * i / screen_height; if ( height2 >= 0 ){ src_rect.x = 0; src_rect.y = screen_height - i * EFFECT_STRIPE_CURTAIN_WIDTH - height2; src_rect.w = screen_width; src_rect.h = height2; drawEffect(&src_rect, &src_rect, effect_dst_surface); } } break; default: not_implemented = true; if (first_time) { snprintf(script_h.errbuf, MAX_ERRBUF_LEN, "effect No. %d not implemented; substituting crossfade", effect_no); errorAndCont(script_h.errbuf); } case 10: // Cross fade height = 256 * effect_counter / effect_duration; effectBlend( NULL, ALPHA_BLEND_CONST, height, &dirty_rect.bounding_box ); break; case 11: // Left scroll width = screen_width * effect_counter / effect_duration; src_rect.x = 0; dst_rect.x = width; src_rect.y = dst_rect.y = 0; src_rect.w = dst_rect.w = screen_width - width; src_rect.h = dst_rect.h = screen_height; drawEffect(&dst_rect, &src_rect, effect_src_surface); src_rect.x = screen_width - width - 1; dst_rect.x = 0; src_rect.y = dst_rect.y = 0; src_rect.w = dst_rect.w = width; src_rect.h = dst_rect.h = screen_height; drawEffect(&dst_rect, &src_rect, effect_dst_surface); break; case 12: // Right scroll width = screen_width * effect_counter / effect_duration; src_rect.x = width; dst_rect.x = 0; src_rect.y = dst_rect.y = 0; src_rect.w = dst_rect.w = screen_width - width; src_rect.h = dst_rect.h = screen_height; drawEffect(&dst_rect, &src_rect, effect_src_surface); src_rect.x = 0; dst_rect.x = screen_width - width - 1; src_rect.y = dst_rect.y = 0; src_rect.w = dst_rect.w = width; src_rect.h = dst_rect.h = screen_height; drawEffect(&dst_rect, &src_rect, effect_dst_surface); break; case 13: // Top scroll width = screen_height * effect_counter / effect_duration; src_rect.x = dst_rect.x = 0; src_rect.y = 0; dst_rect.y = width; src_rect.w = dst_rect.w = screen_width; src_rect.h = dst_rect.h = screen_height - width; drawEffect(&dst_rect, &src_rect, effect_src_surface); src_rect.x = dst_rect.x = 0; src_rect.y = screen_height - width - 1; dst_rect.y = 0; src_rect.w = dst_rect.w = screen_width; src_rect.h = dst_rect.h = width; drawEffect(&dst_rect, &src_rect, effect_dst_surface); break; case 14: // Bottom scroll width = screen_height * effect_counter / effect_duration; src_rect.x = dst_rect.x = 0; src_rect.y = width; dst_rect.y = 0; src_rect.w = dst_rect.w = screen_width; src_rect.h = dst_rect.h = screen_height - width; drawEffect(&dst_rect, &src_rect, effect_src_surface); src_rect.x = dst_rect.x = 0; src_rect.y = 0; dst_rect.y = screen_height - width - 1; src_rect.w = dst_rect.w = screen_width; src_rect.h = dst_rect.h = width; drawEffect(&dst_rect, &src_rect, effect_dst_surface); break; case 15: // Fade with mask effectBlend( effect->anim.image_surface, ALPHA_BLEND_FADE_MASK, 256 * effect_counter / effect_duration, &dirty_rect.bounding_box ); break; case 16: // Mosaic out generateMosaic( effect_src_surface, 5 - 6 * effect_counter / effect_duration ); break; case 17: // Mosaic in generateMosaic( effect_dst_surface, 6 * effect_counter / effect_duration ); break; case 18: // Cross fade with mask effectBlend( effect->anim.image_surface, ALPHA_BLEND_CROSSFADE_MASK, 256 * effect_counter * 2 / effect_duration, &dirty_rect.bounding_box ); break; case (MAX_EFFECT_NUM + 0): // quakey if ( effect_timer_resolution > effect_duration / 4 / effect->no ) effect_timer_resolution = effect_duration / 4 / effect->no; amp = (Sint16)(sin(M_PI * 2.0 * effect->no * effect_counter / effect_duration) * EFFECT_QUAKE_AMP * effect->no * (effect_duration - effect_counter) / effect_duration); dst_rect.x = 0; dst_rect.y = amp; drawEffect(&dst_rect, &src_rect, effect_dst_surface); if (amp >= 0){ quake_rect.y = 0; quake_rect.h = amp; } else{ quake_rect.y = screen_height + amp; quake_rect.h = -amp; } SDL_FillRect( accumulation_surface, &quake_rect, SDL_MapRGBA( accumulation_surface->format, 0, 0, 0, 0xff ) ); break; case (MAX_EFFECT_NUM + 1): // quakex if ( effect_timer_resolution > effect_duration / 4 / effect->no ) effect_timer_resolution = effect_duration / 4 / effect->no; amp = (Sint16)(sin(M_PI * 2.0 * effect->no * effect_counter / effect_duration) * EFFECT_QUAKE_AMP * effect->no * (effect_duration - effect_counter) / effect_duration); dst_rect.x = amp; dst_rect.y = 0; drawEffect(&dst_rect, &src_rect, effect_dst_surface); if (amp >= 0){ quake_rect.x = 0; quake_rect.w = amp; } else{ quake_rect.x = screen_width + amp; quake_rect.w = -amp; } SDL_FillRect( accumulation_surface, &quake_rect, SDL_MapRGBA( accumulation_surface->format, 0, 0, 0, 0xff ) ); break; case (MAX_EFFECT_NUM + 2 ): // quake dst_rect.x = effect->no*((int)(3.0*rand()/(RAND_MAX+1.0)) - 1) * 2; dst_rect.y = effect->no*((int)(3.0*rand()/(RAND_MAX+1.0)) - 1) * 2; SDL_FillRect( accumulation_surface, NULL, SDL_MapRGBA( accumulation_surface->format, 0, 0, 0, 0xff ) ); drawEffect(&dst_rect, &src_rect, effect_dst_surface); break; case (MAX_EFFECT_NUM + 3 ): // flushout if (effect_counter > 0){ width = 30 * effect_counter / effect_duration; height = 30 * (effect_counter + effect_timer_resolution) / effect_duration; if (height > width){ doFlushout(height); effectBlend( NULL, ALPHA_BLEND_CONST, effect_counter * 256 / effect_duration, &dirty_rect.bounding_box, effect_tmp_surface ); } } break; case 99: // dll-based if (dll != NULL) { if (!strncmp(dll, "cascade.dll", 11)) { effectCascade(params, effect_duration); } else if (!strncmp(dll, "whirl.dll", 9)) { effectWhirl(params, effect_duration); } else if (!strncmp(dll, "trvswave.dll", 12)) { effectTrvswave(params, effect_duration); } else if (!strncmp(dll, "breakup.dll", 11)) { effectBreakup(params, effect_duration); } else { not_implemented = true; if (first_time) { snprintf(script_h.errbuf, MAX_ERRBUF_LEN, "dll effect '%s' (%d) not implemented; substituting crossfade", dll, effect_no); errorAndCont(script_h.errbuf); } } } else { //just in case no dll is given not_implemented = true; if (first_time) { snprintf(script_h.errbuf, MAX_ERRBUF_LEN, "no dll provided for effect %d; substituting crossfade", effect_no); errorAndCont(script_h.errbuf); } } if (not_implemented) { // do crossfade height = 256 * effect_counter / effect_duration; effectBlend( NULL, ALPHA_BLEND_CONST, height, &dirty_rect.bounding_box ); } break; } if (debug_level > 1) printf("\teffect count %d / dur %d\n", effect_counter, effect_duration); effect_counter += effect_timer_resolution; //check for events before drawing event_mode = IDLE_EVENT_MODE; event_mode |= WAIT_NO_ANIM_MODE; if (effectskip_flag) { event_mode |= WAIT_INPUT_MODE; } waitEvent(0); event_mode &= ~(WAIT_NO_ANIM_MODE | WAIT_INPUT_MODE); if ( effect_counter < effect_duration && effect_no != 1 ){ if ( effect_no != 0 ) flush( REFRESH_NONE_MODE, NULL, false ); if (effectskip_flag && skip_effect) effect_counter = effect_duration; return true; } else { //last call SDL_BlitSurface(effect_dst_surface, &dirty_rect.bounding_box, accumulation_surface, &dirty_rect.bounding_box); if (effect_no != 0) flush(REFRESH_NONE_MODE, NULL, clear_dirty_region); if (effect_no == 1) effect_counter = 0; else if ((effect_no == 99) && (dll != NULL)){ dll = params = NULL; } display_mode &= ~DISPLAY_MODE_UPDATED; if (effect_blank != 0 && effect_counter != 0) { event_mode = WAIT_TIMER_MODE; if ( ctrl_pressed_status || (skip_mode & SKIP_TO_WAIT) ) waitEvent(1); //allow a moment to detect ctrl unpress, if any else waitEvent(effect_blank); } event_mode = IDLE_EVENT_MODE; return false; } }